Check presence of fix for errata 843419 in Cortex-A53
authorJonathan Wright <[email protected]>
Wed, 28 Mar 2018 14:52:03 +0000 (15:52 +0100)
committerJonathan Wright <[email protected]>
Thu, 12 Apr 2018 11:12:56 +0000 (12:12 +0100)
A fix for errata 843419 may be available in revision r0p4 of the
Cortex-A53 processor. The presence of the fix is determined by checking
bit 8 in the REVIDR register.

If the fix is present we report ERRATA_NOT_APPLIES which silences the
erroneous 'missing workaround' warning.

Change-Id: Ibd2a478df3e2a6325442a6a48a0bb0259dcfc1d7
Signed-off-by: Jonathan Wright <[email protected]>
include/lib/cpus/aarch64/cpu_macros.S
lib/cpus/aarch64/cortex_a53.S
lib/cpus/aarch64/cpu_helpers.S

index 8f0a74f0a3f397b9432f352016142e5fd1c1222f..bfe2449e9a05f04d916c21ae7def2472fc78126e 100644 (file)
@@ -230,6 +230,7 @@ CPU_OPS_SIZE = .
 
        /* Check whether errata applies */
        mov     x0, \_rev_var
+       /* Shall clobber: x0-x7 */
        bl      check_errata_\_id
 
        .ifeq \_chosen
index 3e480bc1fe2ddb1ab111cfa98954f6b5b9a1141e..bec5b9e030be4d4ab3383ba41c188e81cd69f96a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -9,6 +9,7 @@
 #include <cortex_a53.h>
 #include <cpu_macros.S>
 #include <debug.h>
+#include <errata_report.h>
 #include <plat_macros.S>
 
 #if A53_DISABLE_NON_TEMPORAL_HINT
@@ -154,8 +155,22 @@ endfunc check_errata_835769
  * This workaround is statically enabled at build time.
  */
 func check_errata_843419
-       mov     x1, #0x04
-       b       cpu_rev_var_ls
+       mov     x1, #ERRATA_APPLIES
+       mov     x2, #ERRATA_NOT_APPLIES
+       cmp     x0, #0x04
+       csel    x0, x1, x2, ls
+       /*
+        * Fix potentially available for revision r0p4.
+        * If r0p4 check for fix in REVIDR, else exit.
+        */
+       b.ne    exit_check_errata_843419
+       /* Load REVIDR. */
+       mrs     x3, revidr_el1
+       /* If REVIDR[8] is set (fix exists) set ERRATA_NOT_APPLIES, else exit. */
+       tbz     x3, #8, exit_check_errata_843419
+       mov     x0, x2
+exit_check_errata_843419:
+       ret
 endfunc check_errata_843419
 
        /* -------------------------------------------------
index 5a9226d8326430fe0d1dc8615d9b026f33fa8b61..9f13ed2ca20b8ad4dd4227ba07d304ae11783322 100644 (file)
@@ -198,6 +198,8 @@ endfunc cpu_get_rev_var
  * Compare the CPU's revision-variant (x0) with a given value (x1), for errata
  * application purposes. If the revision-variant is less than or same as a given
  * value, indicates that errata applies; otherwise not.
+ *
+ * Shall clobber: x0-x3
  */
        .globl  cpu_rev_var_ls
 func cpu_rev_var_ls
@@ -212,6 +214,8 @@ endfunc cpu_rev_var_ls
  * Compare the CPU's revision-variant (x0) with a given value (x1), for errata
  * application purposes. If the revision-variant is higher than or same as a
  * given value, indicates that errata applies; otherwise not.
+ *
+ * Shall clobber: x0-x3
  */
        .globl  cpu_rev_var_hs
 func cpu_rev_var_hs